package frpc.manager.string;

import frpc.manager.basics.IRedisBusinessManager;
import frpc.manager.operation.GiveCacheData;
import frpc.manager.operation.RedisLockErrorFunction;
import frpc.manager.operation.RedisLockSuccessFunction;
import org.springframework.data.redis.core.ValueOperations;

import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * 类描述:  Redis字符串处理接口
 *
 * @author 王雷
 * @version 1.0.0
 * @date 2022/6/2 0002 下午 3:12
 */
public interface IRedisSerializableManager extends IRedisBusinessManager {

    /**
     * 功能描述：获取字符串处理对象完成自定义处理
     *
     * @author : 王雷
     * @date : 2022/6/2 0002 下午 3:12
     */
    <T> ValueOperations<String, T> giveValueOperations();

    /**
     * 功能描述：添加数据到指定的Key中，不限制时间
     *
     * @param key   需要插入的Key
     * @param value 需要插入的内容
     * @author : 王雷
     * @date : 2022/6/2 0002 下午 3:12
     */
    <T> void addBatchValueByKey(String key, Map<String, T> value);

    /**
     * 功能描述：添加数据到指定的Key中，不限制时间
     *
     * @param key   需要插入的Key
     * @param value 需要插入的内容
     * @author : 王雷
     * @date : 2022/6/2 0002 下午 3:12
     */
    <T> void addBatchValueByKey(String key, Map<String, T> value, long time);

    /**
     * 功能描述：添加数据到指定的Key中
     *
     * @param key   需要插入的Key
     * @param value 需要插入的内容
     * @param time  失效时间，单位：秒
     * @author : 王雷
     * @date : 2022/6/2 0002 下午 3:12
     */
    <T> void addValueByKey(String key, T value, long time);

    /**
     * 功能描述：添加数据到指定的Key中
     *
     * @param key   需要插入的Key
     * @param value 需要插入的内容
     * @param time  失效时间
     * @param time  失效时间单位
     * @author : 王雷
     * @date : 2022/6/2 0002 下午 3:12
     */
    <T> void addValueByKey(String key, T value, long time, TimeUnit timeUnit);

    /**
     * 功能描述：添加数据到指定的Key中，不限制时间
     *
     * @param key   需要插入的Key
     * @param value 需要插入的内容
     * @author : 王雷
     * @date : 2022/6/2 0002 下午 3:12
     */
    <T> void addValueByKey(String key, T value);

    /**
     * 获取数据
     *
     * @param key 键
     * @return 值
     */
    <T> T giveValueByKey(String key);

    /**
     * 获取数据
     *
     * @param keys 键
     * @return 值
     */
    <T> List<T> giveBatchValueByKey(Collection<String> keys);

    /**
     * 获取数据
     *
     * @param keys 键
     * @return 值
     */
    <T> List<T> giveBatchValueByKey(String... keys);

    /**
     * 递增
     *
     * @param key   键
     * @param delta 要增加几(大于0)
     * @return 结果
     */
    Long incr(String key, long delta);

    /**
     * 递减
     *
     * @param key   键
     * @param delta 要减少几
     * @return 结果
     */
    Long decr(String key, long delta);

    /**
     * 功能描述：获取数据，带锁处理
     *
     * @param key           需要查询的Key
     * @param giveCacheData 需要执行的回调函数
     * @return : 结果
     * @throws Exception 执行异常
     * @author : 王雷
     * @date : 2020/11/30 0030 下午 7:51
     */
    <T> T giveValueByKeyToLock(String key, GiveCacheData<T> giveCacheData) throws Exception;

    /**
     * 功能描述：获取数据，带锁处理
     *
     * @param key                      需要查询的Key
     * @param redisLockSuccessFunction Redis锁处理中正常处理函数
     * @param trRedisLockErrorFunction Redis锁处理中异常处理函数
     * @param giveCacheData            需要执行的回调函数
     * @return : 结果
     * @author : 王雷
     * @date : 2020/11/30 0030 下午 7:51
     */
    <T, R> R giveValueByKeyToLock(String key, RedisLockSuccessFunction<T, R> redisLockSuccessFunction
            , RedisLockErrorFunction<R> trRedisLockErrorFunction, GiveCacheData<T> giveCacheData);

    /**
     * 功能描述：获取数据，带锁处理
     *
     * @param key           需要查询的Key
     * @param giveCacheData 需要执行的回调函数
     * @param putMaxTime    存储的时间
     * @param timeUnit      存储时间单位
     * @return : 结果
     * @throws Exception 执行异常
     * @author : 王雷
     * @date : 2020/11/30 0030 下午 7:51
     */
    <T> T giveValueByKeyToLock(String key, GiveCacheData<T> giveCacheData, Long putMaxTime, TimeUnit timeUnit) throws Exception;

    /**
     * 功能描述：获取数据，带锁处理
     *
     * @param key                      需要查询的Key
     * @param redisLockSuccessFunction Redis锁处理中正常处理函数
     * @param trRedisLockErrorFunction Redis锁处理中异常处理函数
     * @param giveCacheData            需要执行的回调函数
     * @param putMaxTime               存储的时间
     * @param timeUnit                 存储时间单位
     * @return : 结果
     * @author : 王雷
     * @date : 2020/11/30 0030 下午 7:51
     */
    <T, R> R giveValueByKeyToLock(String key, RedisLockSuccessFunction<T, R> redisLockSuccessFunction
            , RedisLockErrorFunction<R> trRedisLockErrorFunction, GiveCacheData<T> giveCacheData, Long putMaxTime
            , TimeUnit timeUnit);

}
